/*
 * //////////////////////////////////////////////
 * 	Edk JavaScript Library
 * 	Edk lib. is under BSD License
 *  for Server Side JavaScript and Client Side.
 * 	Frank Cheung <frank@ajaxjs.com>
 *  http://www.ajaxjs.com
 * /////////////////////////////////////////////
 */
;(function(){
	/**
	 * 获取来自表单的各个字段的数据。HTTP FORM所提交的数据乃是key/value配对的结构。
	 * 本函数是把这些key/value集合转化成为JavaScript对象。这是post包最核心的函数。
	 * 对各个字段有decodeURI()、unescape()、$$.getPerm()自动类型转化的功能。
	 * @param {Boolean/String} isAllRequest true表示为返回QueryString和Form的Request对象集合。
	 * 如果指定form则返回表单的hash值，如果指定QueryString则返回URL上面的参数hash。
	 * @param {Boolean} isAutoType 是否进行自动类型转换。
	 * @return {Object} 客户端提交的数据或查询参数。
	 */
	function emuRequest(isAutoType, emuableObj){
	    var 
	         key
	        ,e
	        ,v
	        ,queryObj = {
	        	_count : 0
	        }
	        ,i = 0;
	        
	    if(!emuableObj)return queryObj;
	    if(emuableObj && emuableObj.count <= 0)return queryObj;
	        
	    for(e = new Enumerator(emuableObj); !e.atEnd(); e.moveNext()){
	        key = e.item().toString();
	        v   = emuableObj(key)(); // MS ASP这里好奇怪，不加()不能返回字符串
	        
//	        	v 	= decodeURI(v);
//	            v 	= unescape(v);
	        queryObj[key] = isAutoType ? $$.getPerm(v) : v;
	        i++;
	    }
	    
	    queryObj._count = i; // 字段总数
	    return queryObj;
	}
	
	$$.server = {
		 getRequest_QueryString	: emuRequest.delegate(null, Request.QueryString)
		,getRequest_Form		: emuRequest.delegate(null, Request.Form)
		,getAll_Request			: emuRequest.map([Request.QueryString, Request.Form, Request.Cookie]).C(function(){
			var allRequest = {
				_count: 0
			};
			$$.each($$.fixArgs(arguments), function(obj){
				if(obj._count > 0){
					var count = this._count + obj._count;
					$$.apply(this, obj);
					this._count = count;
				}
			}, allRequest);
			
			return allRequest;
		})
	};
	// make them as list.
	var _server = $$.server;
	_server.getRequest_Form_toList			= _server.getRequest_Form.C($$.toArray);
	_server.getRequest_QueryString_toList	= _server.getRequest_QueryString.C($$.toArray);
	_server.getAll_Request_toList			= _server.getAll_Request.C($$.toArray);
})();

$$.Server = $$.server;

/**
 * @class $$.Server.controller
 */
$$.Server.controller = function(cfg){
	Object.apply(this, cfg);
}
;(function(){
	
	$$.Server.controller.prototype = {
		
	};
})();

/**
 * @class $$.Server.controller.pagingComponent
 * 分页类。分页类只支持MySQL式的start/limit分页查询。
 */
$$.Server.controller.pagingComponent = function(startNum){
	var 
		 startNum = startNum || Request('start')() || 0
		,startNum = Number(startNum);
	/**
	 * @property {Number} startNum 第一页的记录数。
	 */	
	this.startNum = startNum;	
	
	/**
	 * @property {Number} 每页页数。
	 */ 
	 this.limitNum = Number(Request('limit')()) || 8
	 // 等同于limitNum。
	,this.pageSize = this.limitNum;
}
;(function(){
	$$.Server.controller.pagingComponent.prototype = {
		renderPagingBar : function(matchTotal_Num){
			var 
	         pageSize = this.pageSize
	         // 计算分页总数。
	        ,pages        = matchTotal_Num % pageSize ? Math.floor(matchTotal_Num / pageSize) + 1 : matchTotal_Num / pageSize
	         // 获取当前的页码。由客户端指定在第几页。
	        ,currentPage  = (Number(Request('start')()) || 0) / pageSize + 1
	        
	        /**
	         * 是否存在除了start以外的参数。
	         * @return {Boolean}
	         */
	        ,hasQueryStr = (function(){
	            var req = Request.QueryString;
	            if(req.Count > 0){
	                if(req.Count == 1 && req('start').Count){
	                    return false;
	                }
	                return true;
	            }else{
	                return false;
	            }
	        })()
	        
	        /**
	         * 不要影响其他的参数。也就是要保留其他的参数。
	         */
	        ,getQueryString = function(){
	            var 
	            	 arr		= []
	            	,QueryObj	= $$.Server.getRequest_QueryString();
	            if( QueryObj.start || QueryObj.start === 0 ){
	                delete QueryObj.start;
	            }
	            for(var i in QueryObj){
	                arr.push(i + '=' + QueryObj[i]);
	            }
	            return arr.join('&');        
	        }
	        ,el = '<li><a href="{0}" title="{1}">{2}</a></li>'
	        // 上一页
	        ,renderBOF = (function(){
	            var urlP = "?start={0}";
	            
	            if(hasQueryStr){
	                urlP += "&" + getQueryString(); 
	            }
	            var startNum = (currentPage - 2) * pageSize;
	            var args = (startNum < 0) ? [ urlP.format(0), "首页" , "首页" ] : [ urlP.format(startNum), "下一页", "前页"]; 
	            return "".format.apply(el, args);
	        })()
	                    
	        // 下一页
	        ,renderEOF = (function(){
	            var urlP = "?start={0}";
	            
	            if(hasQueryStr){
	                urlP += "&" + getQueryString(); 
	            }
	                
	            var 
	                 endNum   = currentPage * pageSize
	                ,nextPage = (endNum > matchTotal_Num) ? (currentPage - 1) * pageSize : endNum;
	            return el.format(urlP.format(nextPage), "后一页", "后页");
	        })()
	
	
	        ,renderBar = function(current){
	            var link = {
	                 href   : "?start={0}"
	                ,title  : ""
	                ,text   : ""
	            };
	            if(hasQueryStr){
	                link.href += "&" + getQueryString(); 
	            }
	            
	            if(!pages)throw "总页数未准备好！";
	            var e, html, links = [];
	            var page;
	            
	            for(var i = 0; i < pages; i++){
	                page     = i +1;
	                
	                e       = $$.apply({}, link);
	                e.href  = e.href.format( i * pageSize); // 倍数关系
	                e.text  = page;
	                e.title = "-->" + page;
	                
	                html     = el.format(e.href, e.title, e.text);
	                if(page == current){
	                    html = html.replace("<li", "<li class=\"highlight\"");
	                }
	                links.push(html);
	            }
	            return links.join('\n');
	        }
	        ,renderAnchor = $$.cfg.Tags('//dataPage/span').format(currentPage, pages, matchTotal_Num, pageSize)
	        ,render = '<ul class="edk-pagingbar">' + renderBOF + renderBar(currentPage) + renderEOF + "</ul><center>" + renderAnchor +"</center>";
	            	
	    	return render;
	    }
	};
})();